package com.ssy.lingxi.purchase.service;

import com.ssy.lingxi.common.constant.order.OrderPurchaseProcessTypeEnum;
import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.api.model.vo.response.OrderPurchaseProcessFeignDetailVO;
import com.ssy.lingxi.purchase.entity.PurchaseRequisition;
import com.ssy.lingxi.purchase.model.request.RequisitionPageReq;
import com.ssy.lingxi.purchase.model.request.RequisitionProductReq;
import com.ssy.lingxi.purchase.model.response.*;

import java.util.List;

/**
 * @author wyx
 * @version 2.0.0
 * @date 2021-10-28
 */
public interface ICommonService {
    /**
     * 校验Srm订单商品接口参数
     * @param requisition 订单
     * @param products            订单物料列表
     * @param isCreate            是否新增，true表示新增， false表示修改
     * @return 订单总金融
     */
    Wrapper<PurchaseProductCheckRes> checkRequisitionProduct(PurchaseRequisition requisition, List<RequisitionProductReq> products, boolean isCreate);

    /**
     * 启动订单流程
     * @param requisition 请购单
     * @return 启动结果
     */
    Wrapper<PurchaseProcessTaskRes> startPurchaseProcess(PurchaseRequisition requisition);

    /**
     * 查询（采购）会员采购流程配置
     * @param buyerMemberId           采购会员Id
     * @param buyerRoleId             采购会员角色Id
     * @param purchaseProcessTypeEnum 采购流程类型
     * @return 查询结果
     */
    Wrapper<OrderPurchaseProcessFeignDetailVO> findPurchaseProcess(Long buyerMemberId, Long buyerRoleId, OrderPurchaseProcessTypeEnum purchaseProcessTypeEnum);

    /**
     * 保存订单内部流转记录
     * @param memberId 登录用户会员Id
     * @param roleId    登录用户会员角色Id
     * @param userName 登录用户姓名
     * @param organizationName 登录用户组织机构名称
     * @param jobTitle 登录用户职位
     * @param orderId 订单Id
     * @param operation  操作
     * @param statusName 订单状态名称
     * @param remark    备注
     */
    void savePurchaseInnerHistory(Long memberId, Long roleId, String userName, String organizationName, String jobTitle, Long orderId, String operation, String statusName, String remark);

    /**
     * 查询请购单流程
     * @param processKey 流程Key
     * @param taskId 流程步骤任务Id
     * @param vendorMemberId 供应商会员Id
     * @return 查询结果
     */
    Wrapper<ProcessStepsRes> findRequisitionProcessSteps(String processKey, String taskId, Long vendorMemberId);

    /**
     * 订单商品汇总信息
     * @param requisition 订单
     * @return 订单商品汇总
     */
    PurchaseProductRes purchaseProducts(PurchaseRequisition requisition);

    /**
     * 查询采购订单内部流转记录
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param orderId 订单Id
     * @return 内部流转记录
     */
    List<PurchaseInnerHistoryVO> listBuyerOrderInnerHistories(Long buyerMemberId, Long buyerRoleId, Long orderId);

    /**
     * 执行请购单下个流程
     * @param requisition 请购单
     * @param agree      执行下个流程跳转参数
     * @return 内部流转记录
     */
    Wrapper<PurchaseProcessTaskRes> executeRequisitionProcess(PurchaseRequisition requisition, Integer agree);

    /**
     * 公共的请购单分页实现
     * @param loginUser 登录用户信息
     * @param req 分页请求参数
     * @param buyerInnerStatus 内部状态集合
     * @param isTransferPurchase 是否为请购单转采购订单分页
     * @return 查询结果
     */
    Wrapper<PageData<RequisitionPageRes>> getBaseRequisitionPage(UserLoginCacheDTO loginUser, RequisitionPageReq req, List<Integer> buyerInnerStatus, Boolean isTransferPurchase);
}